﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using SegIdenPC.Entidad;
using SegIdenPC.Herramientas;
using log4net;
using GS1.Utilitario;
using System.Drawing.Imaging;
using System.Configuration;
using SegIdenPC.Utilitarios;
using System.Diagnostics;

namespace SegIdenPC.Formularios
{
    public partial class frmReporteInventario : Form
    {
        #region --- Variables y Propiedades ---
        private static readonly ILog log = LogManager.GetLogger(typeof(frmReporteInventario));

        private const string LLAVE_RUTAIMAGEN = "RUTAARCHIVO";

        private const string TITULO = "Reporte Inventario";
        private const string FORMATO_TOTAL_ENCONTRADOS = "Total registros: {0}";

        private string RUTA_ARCHIVO_TEMPORAL = ConfigurationManager.AppSettings[LLAVE_RUTAIMAGEN];
        private const string APLICACION_EXCEL = "excel.exe";
       
        private const string FORMATO_PRODUCTO_DESCRIPCION_DETALLADA = "{0} - {1} - {2} - {3}";

        private Tienda  tiendaReporte = null;
        private ReporteInventario reporteInventario = null;
        
    

        #endregion

        #region --- Constructor ---
        public frmReporteInventario()
        {
            InitializeComponent();
        }
        #endregion

        #region --- Eventos Formulario ---

        private void frmReporteInventario_Load_1(object sender, EventArgs e)
        {
            cargarFormulario();
        }
        private void btnBuscarTiendaO_Click_1(object sender, EventArgs e)
        {
            elegirTienda();
        }
        private void tbtnImprimir_Click(object sender, EventArgs e)
        {
            exportarData();
        }

       private void tbtnSalir_Click(object sender, EventArgs e)
        {
            salir();
        }
       private void tbtnVer_Click_1(object sender, EventArgs e)
        {
            ejecutarReporte();
        }
        
        #endregion
        
        #region --- Metodos Propios ---
        
        private void cargarFormulario()
        {
            ListaGeneral listaReporte = null;
             try
            {
                Cursor.Current = Cursors.WaitCursor;

                // Instanciando y creando listado de estado
                listaReporte = new ListaGeneral();
                listaReporte.Add(new General { codigo = "0", descripcion = "---Seleccione---" });
                listaReporte.Add(new General { codigo = Constantes.REPORTE_INVENTARIO_SISTEMA, descripcion = Constantes.REPORTE_DESCRIPCION_INVENTARIO_SISTEMA });
                listaReporte.Add(new General { codigo = Constantes.REPORTE_INVENTARIO_TIENDA, descripcion = Constantes.REPORTE_DESCRIPCION_INVENTARIO_TIENDA});
                listaReporte.Add(new General { codigo = Constantes.REPORTE_INVENTARIO_VALORIZADO_TIENDA, descripcion = Constantes.REPORTE_DESCRIPCION_INVENTARIO_VALORIZADO_TIENDA});
               
                //poblando lista de reportes
                this.cboReportes.DataSource = listaReporte;
                this.cboReportes.ValueMember = Constantes.GENERAL_CODIGO;
                this.cboReportes.DisplayMember = Constantes.GENERAL_DESCRIPCION;
                this.cboReportes.SelectedIndex = 0;
            }
            catch (Exception ex)
            {
                log.Error(ex.Message, ex);
                Libreria.MensajeError(ex, TITULO);
            }
            finally
            {
                Cursor.Current = Cursors.Default;
            }
        }

        private void elegirTienda()
        {
            using (frmMantTienda frmMantTienda = new frmMantTienda())
            {
                frmMantTienda.formularioBusqueda = true;
                if (frmMantTienda.ShowDialog() == DialogResult.Cancel) { return; }

                this.tiendaReporte = frmMantTienda.tiendaActual;
                this.txtTiendaOCodigo.Text = this.tiendaReporte.codigo;
                this.txtTiendaODescripcion.Text = this.tiendaReporte.nombre;
            }
        }

        private void salir()
        {
            this.Close();
        }

        private void ejecutarReporte()
        {
            switch (this.cboReportes.SelectedValue.ToString())
            {
                case Constantes.REPORTE_INVENTARIO_SISTEMA:
                    obtieneReporteInvSistema();
                    break;
                case Constantes.REPORTE_INVENTARIO_TIENDA:
                    obtieneReporteInvTienda();
                    break;
                case Constantes.REPORTE_INVENTARIO_VALORIZADO_TIENDA:
                    obtieneReporteInvValTienda();

                    break;
                default:
                    break;
            }
        }

        private void obtieneReporteInvSistema()
        {

            Operacion operacion = null;
            string contenidoXML = string.Empty;

            // Estableciendo operacion a ser enviada al Servicio REST
            operacion = new Operacion();
            operacion.numero = Constantes.OPERACION_OBTENER_REPORTE_INVENTARIO_SISTEMA;
       
            operacion.inventario = new Inventario();
            operacion.inventario.tienda = new Tienda();
            operacion.inventario.tienda.codigo = this.txtTiendaOCodigo.Text;
            operacion.inventario.codInventario = this.txtCodigoInventario.Text;
            
          
            // Instanciando y ejecutando llamada al ServicioREST
            ConexionREST conexionREST = new ConexionREST();
            contenidoXML = conexionREST.ejecutarOperacion(operacion);

            // Obteniendo Objeto de Error
            OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

            // Validar si hay error
            if (operacionError != null)
            {
                Libreria.ShowMessageboxError(operacionError.descripcion);
                return;
            }

            // Obteniendo Objeto de ReporteInventario
            this.reporteInventario = contenidoXML.DeserializarTo<ReporteInventario>();

            
            //poblar la grilla
            poblarGrilla();
        }

        private void obtieneReporteInvValTienda()
        {

            Operacion operacion = null;
            string contenidoXML = string.Empty;

            // Estableciendo operacion a ser enviada al Servicio REST
            operacion = new Operacion();
            operacion.numero = Constantes.OPERACION_OBTENER_REPORTE_INVENTARIO;

            operacion.inventario = new Inventario();
            operacion.inventario.tienda = new Tienda();
            operacion.inventario.tienda.codigo = this.txtTiendaOCodigo.Text;
            operacion.inventario.codInventario = this.txtCodigoInventario.Text;

            // Instanciando y ejecutando llamada al ServicioREST
            ConexionREST conexionREST = new ConexionREST();
            contenidoXML = conexionREST.ejecutarOperacion(operacion);

            // Obteniendo Objeto de Error
            OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

            // Validar si hay error
            if (operacionError != null)
            {
                Libreria.ShowMessageboxError(operacionError.descripcion);
                return;
            }

            // Obteniendo Objeto de ReporteInventario
            this.reporteInventario = contenidoXML.DeserializarTo<ReporteInventario>();


            //poblar la grilla
             poblarGrilla();
        }

        private void obtieneReporteInvTienda()
        {

            Operacion operacion = null;
            string contenidoXML = string.Empty;

            // Estableciendo operacion a ser enviada al Servicio REST
            operacion = new Operacion();
            operacion.numero = Constantes.OPERACION_OBTENER_REPORTE_INVENTARIO;

            operacion.inventario = new Inventario();
            operacion.inventario.tienda = new Tienda();
            operacion.inventario.tienda.codigo = this.txtTiendaOCodigo.Text;
            operacion.inventario.codInventario = this.txtCodigoInventario.Text;

            // Instanciando y ejecutando llamada al ServicioREST
            ConexionREST conexionREST = new ConexionREST();
            contenidoXML = conexionREST.ejecutarOperacion(operacion);

            // Obteniendo Objeto de Error
            OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

            // Validar si hay error
            if (operacionError != null)
            {
                Libreria.ShowMessageboxError(operacionError.descripcion);
                return;
            }

            // Obteniendo Objeto de ReporteInventario
            this.reporteInventario = contenidoXML.DeserializarTo<ReporteInventario>();


            //poblar la grilla
            poblarGrilla();
        }

        private void poblarGrilla()
        {
            ListaLineaReporteInventario nuevaListaLineaReporteInventario = new ListaLineaReporteInventario(); /*llamar a ListaLineaReporteInventario*/

            this.dgvListado.AutoGenerateColumns = false;


            if (this.txtCodigoInventario.Text != "")
            {
                foreach (LineaReporteInventario lineaReporteInventarioActual in reporteInventario.listaLineaReporteInventario.lista )
                {
                    //if (LineaReporteInventarioActual == txtCodigoInventario.Text) /
                    //{
                    nuevaListaLineaReporteInventario.add(lineaReporteInventarioActual);
                   //}
                }

                this.dgvListado.DataSource = nuevaListaLineaReporteInventario == null ?
                                                     new ListPersonalizada<LineaReporteInventario>() :
                                                     nuevaListaLineaReporteInventario.lista;


            }
            else
            {
                this.dgvListado.DataSource = reporteInventario.listaLineaReporteInventario  == null ?
                                                      new ListPersonalizada<LineaReporteInventario>() :
                                                      reporteInventario.listaLineaReporteInventario.lista;


            }


        pintarGrilla(this.dgvListado);
        }

        
              
        private void pintarGrilla(DataGridView grilla)
        {
            ListPersonalizada<LineaReporteInventario> listaLineaReporteInventario = null;
            listaLineaReporteInventario = (ListPersonalizada<LineaReporteInventario>)grilla.DataSource;
                 
            switch (this.cboReportes.SelectedValue.ToString())
            {
              case Constantes.REPORTE_INVENTARIO_SISTEMA:

              if (listaLineaReporteInventario != null)
                {
                  for (int i = 0; i < listaLineaReporteInventario.Count; i++)
                  {
                    LineaReporteInventario lineaReporteInventario = listaLineaReporteInventario[i];
                    this.dgvListado.Rows[i].Cells[0].Value = lineaReporteInventario.producto.codigo;
                    this.dgvListado.Rows[i].Cells[1].Value = lineaReporteInventario.producto.codProductoProveedor;
                    this.dgvListado.Rows[i].Cells[2].Value = lineaReporteInventario.producto.descripcion;
                    this.dgvListado.Rows[i].Cells[3].Value = "0";
                    this.dgvListado.Rows[i].Cells[4].Value = lineaReporteInventario.producto.nivelProducto;
                    this.dgvListado.Rows[i].Cells[5].Value = lineaReporteInventario.producto.nivelTipo;
                    this.dgvListado.Rows[i].Cells[6].Value = lineaReporteInventario.producto.nivelMaterial;
                    this.dgvListado.Rows[i].Cells[7].Value = lineaReporteInventario.producto.nivelColor;
                    this.dgvListado.Rows[i].Cells[8].Value = lineaReporteInventario.stockSistema;
                    this.dgvListado.Rows[i].Cells[9].Value = "0";
                   }
                 }
                 break;

              case Constantes.REPORTE_INVENTARIO_TIENDA:

              if (listaLineaReporteInventario != null)
                {
                  for (int i = 0; i < listaLineaReporteInventario.Count; i++)
                  {
                    LineaReporteInventario lineaReporteInventario = listaLineaReporteInventario[i];
                    this.dgvListado.Rows[i].Cells[0].Value = lineaReporteInventario.producto.codigo;
                    this.dgvListado.Rows[i].Cells[1].Value = lineaReporteInventario.producto.codProductoProveedor;
                    this.dgvListado.Rows[i].Cells[2].Value = lineaReporteInventario.producto.descripcion;
                    this.dgvListado.Rows[i].Cells[3].Value = "0";
                    this.dgvListado.Rows[i].Cells[4].Value = lineaReporteInventario.producto.nivelProducto;
                    this.dgvListado.Rows[i].Cells[5].Value = lineaReporteInventario.producto.nivelTipo;
                    this.dgvListado.Rows[i].Cells[6].Value = lineaReporteInventario.producto.nivelMaterial;
                    this.dgvListado.Rows[i].Cells[7].Value = lineaReporteInventario.producto.nivelColor;
                    this.dgvListado.Rows[i].Cells[8].Value = "0";
                    this.dgvListado.Rows[i].Cells[9].Value = lineaReporteInventario.stockInventario;
                   }
                 }       
                 break;

               case Constantes.REPORTE_INVENTARIO_VALORIZADO_TIENDA:
               
               if (listaLineaReporteInventario != null)
                {
                  for (int i = 0; i < listaLineaReporteInventario.Count; i++)
                  {
                    LineaReporteInventario lineaReporteInventario = listaLineaReporteInventario[i];
                    this.dgvListado.Rows[i].Cells[0].Value = lineaReporteInventario.producto.codigo;
                    this.dgvListado.Rows[i].Cells[1].Value = lineaReporteInventario.producto.codProductoProveedor;
                    this.dgvListado.Rows[i].Cells[2].Value = lineaReporteInventario.producto.descripcion;
                    this.dgvListado.Rows[i].Cells[3].Value = lineaReporteInventario.producto.precioVentaMaximo;
                    this.dgvListado.Rows[i].Cells[4].Value = lineaReporteInventario.producto.nivelProducto;
                    this.dgvListado.Rows[i].Cells[5].Value = lineaReporteInventario.producto.nivelTipo;
                    this.dgvListado.Rows[i].Cells[6].Value = lineaReporteInventario.producto.nivelMaterial;
                    this.dgvListado.Rows[i].Cells[7].Value = lineaReporteInventario.producto.nivelColor;
                    this.dgvListado.Rows[i].Cells[8].Value = "0";
                    this.dgvListado.Rows[i].Cells[9].Value = lineaReporteInventario.stockInventario;
                   }
                 }       
                 break;
                 default:
                 break;
             }
        }  

                
        private void exportarData()
        {
            if (this.dgvListado.DataSource == null)
            {
                ejecutarReporte();
            }

            ExportarExcel exportarExcel = null;

            try
            {
                // Si no hay informacion en la grilla entoncesa salir
                if (this.dgvListado.Rows.Count <= 0) { return; }

                // Si hay informacion entonces generar archivo
                exportarExcel = new ExportarExcel();
                String sNombreArchivo = "";
                switch (this.cboReportes.SelectedValue.ToString())
                {
                    case Constantes.REPORTE_INVENTARIO_SISTEMA:
                        sNombreArchivo = RUTA_ARCHIVO_TEMPORAL + "\\REPORTE_INVENTARIO_SISTEMA." + DateTime.Now.ToString(Constantes.FORMATO_FECHAHORA_ARCHIVO) + ".xls";
                        break;
                    case Constantes.REPORTE_INVENTARIO_TIENDA:
                        sNombreArchivo = RUTA_ARCHIVO_TEMPORAL + "\\REPORTE_INVENTARIO_TIENDA." + DateTime.Now.ToString(Constantes.FORMATO_FECHAHORA_ARCHIVO) + ".xls";
                        break;
                    case Constantes.REPORTE_INVENTARIO_VALORIZADO_TIENDA:
                        sNombreArchivo = RUTA_ARCHIVO_TEMPORAL + "\\REPORTE_INVENTARIO_VALORIZADO_TIENDA." + DateTime.Now.ToString(Constantes.FORMATO_FECHAHORA_ARCHIVO) + ".xls";
                        break;
                    default:
                        break;
                }

                exportarExcel.crearExcelInventario(sNombreArchivo, this.reporteInventario.inventario, this.dgvListado);

                // Abrir archivo generado
                ProcessStartInfo psi = new ProcessStartInfo(APLICACION_EXCEL, RUTA_ARCHIVO_TEMPORAL);
                Process p = Process.Start(psi);
            }
            catch (Exception ex)
            {
                log.Error(ex.Message, ex);
                Libreria.MensajeError(ex, this.Text);
            }
        }
        #endregion
    }
}
